package com.yuncheng.spcyApi.spcyService;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuncheng.constant.SysUserConstant;
import com.yuncheng.oaApi.service.IOaNkRsDjhglService;
import com.yuncheng.spcyApi.constant.common.LogConstant;
import com.yuncheng.spcyApi.constant.common.SpcyCommonConstant;
import com.yuncheng.spcyApi.constant.common.SpcyConstant;
import com.yuncheng.spcyApi.constant.jcy.JcyFybxdConstant;
import com.yuncheng.spcyApi.entity.*;
import com.yuncheng.exception.BusinessException;
import com.yuncheng.entity.YcSysUser;
import com.yuncheng.spcyApi.flow.SpcyFlowConstant;
import com.yuncheng.spcyApi.mapper.SpcyJcyFybxdMapper;
import com.yuncheng.spcyApi.service.*;
import com.yuncheng.spcyApi.utils.*;
import com.yuncheng.spcyApi.vo.common.HttpResultVo;
import com.yuncheng.spcyApi.vo.common.OrderItemVo;
import com.yuncheng.spcyApi.vo.common.PageVo;
import com.yuncheng.spcyApi.vo.sqsx.AddJcyBxryInfoVo;
import com.yuncheng.vo.HttpResult;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import utils.DateConversionUtils;
import utils.LogUtils;
import utils.ObjectToMapUtils;

import javax.annotation.Resource;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.*;

/**
 * @author hua
 */
@Component(value = "jcyFybxdService")
public class JcyFybxdService {

    private static final Logger log = LoggerFactory.getLogger(JcyFybxdService.class);

    @Resource
    private ISpcyJcyFybxdgrjlService spcyJcyFybxdgrjlService;

    @Resource
    private ISpcySqsxHydjryService spcySqsxHydjryService;

    @Resource
    private ISpcySqsxXpjlService spcySqsxXpjlService;

    @Resource
    private ISpcyJcyFybxdService spcyJcyFybxdService;

    @Resource
    private SpcyJcyFybxdMapper spcyJcyFybxdMapper;

    @Resource
    private ISpcyJcyFybxxmmxjlService spcyJcyFybxxmmxjlService;

    @Resource
    private ISpcyJcyFybxdtssxsqService spcyJcyFybxdtssxsqService;

    @Resource
    private ISpcySqsxBaiscService spcySqsxBaiscService;

    @Resource
    private ISpcySqsxWjjlService spcySqsxWjjlService;

    @Resource
    private IYcSysUserService sysUserService;

    @Resource
    private ISpcyLogService spcyLogService;

    @Resource
    private IOaNkRsDjhglService oaNkRsDjhglService;

    /**
     * 初始化申请事项-费用报销单
     * @param sqsxid
     */
    public void initSqsxFybxd(String sqsxid){
        if (StringUtils.isBlank(sqsxid)){
            throw new BusinessException("申请参数为空！");
        }

        this.initSqsxFybxd(sqsxid, null);
    }

//    @Async(value = "asyncNormalTask")
    public void initSqsxFybxd(String sqsxid, SpcySqsxBasic sqsx){

        if (sqsx == null) {
            sqsx = spcySqsxBaiscService.selectSqsxInfoById(sqsxid);
            if (sqsx == null) {
                throw new BusinessException("没有相匹配的数据！");
            }
        }

        List<SpcyJcyFybxd> bxdList = spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>()
                .eq(SpcyJcyFybxd::getFsqsxid, sqsxid));
        if (CollectionUtil.isNotEmpty(bxdList)){
            throw new BusinessException("已经存在对应的报销单信息！");
        }

        if (StringUtils.isBlank(sqsx.getFzbr())){
            throw new BusinessException("经办人为空！");
        }

        YcSysUser jbrUser = sysUserService.getById(StringPatternUtils.getListByIds(sqsx.getFzbr()).get(0));

        String bxnrms = "对";
        bxnrms += "【" + Optional.ofNullable(sqsx.getFqymc()).orElseGet(()->"事项") + "】";
        bxnrms += "【" + Optional.ofNullable(sqsx.getFsxmc()).orElseGet(()->"企业") + "】";
        bxnrms += "现场检查，";
        bxnrms += "地址：" + "【"+sqsx.getFjcdd()+"】";

        // 检查开始、结束时间/天数
        String jcksrq = (sqsx.getFcykssj() != null) ? DateConversionUtils.DateToString(sqsx.getFcykssj()) : "无";;
        String jcjsrq = (sqsx.getFcyjssj() != null) ? DateConversionUtils.DateToString(sqsx.getFcyjssj()) : "无";;
        int jcts = 0;
        if (sqsx.getFcyjssj() != null && sqsx.getFcykssj() != null) {
            jcts = (int) DateUtil.between(sqsx.getFcykssj(), sqsx.getFcyjssj(), DateUnit.DAY) + 1;
        }

        String bxsjms = "";
        bxsjms += jcksrq + "至" + jcjsrq + "共" + jcts + "天";

        SpcyJcyFybxd fybxd = new SpcyJcyFybxd();
        fybxd.setId(GetUuIdUtils.ReplaceUuId());
        fybxd.setFsqsxid(sqsxid);

        fybxd.setFjbrid(jbrUser.getId());
        fybxd.setFjbr(jbrUser.getRealname());
        fybxd.setFjbksid(jbrUser.getOrgId());
        fybxd.setFjbks(jbrUser.getOrgName());

        fybxd.setFjcqymc(sqsx.getFqymc());
        fybxd.setFqydz(sqsx.getFqyzszcdz());
        fybxd.setFqyszds(SpcyCommonConstant.getQyszdsByQydz(sqsx.getFqyzszcdz()));
        fybxd.setFqyszqx(StringUtils.isNotBlank(sqsx.getFszdq()) ? sqsx.getFszdq() : StringUtils.isNotBlank(sqsx.getFqyzszcdz()) ? sqsx.getFqyzszcdz() : "");

        fybxd.setFjcsxmc(sqsx.getFsxmc());
        fybxd.setFjcksrq(jcksrq);
        fybxd.setFjcjsrq(jcjsrq);
        fybxd.setFjcts(jcts);

        fybxd.setFhjbxje("0"); // 合计报销金额
        fybxd.setFlwfbxje("0"); // 劳务费报销金额
        fybxd.setFclfbxje("0"); // 差旅费报销金额

        fybxd.setFbxnrms(bxnrms);
        fybxd.setFbxsjms(bxsjms);

        try {
            fybxd.setFdjh(oaNkRsDjhglService.JcyGetDocumentNumber(fybxd.getId()));
        }catch (Exception e){
            log.error("检查员报销单-生成单据号错误: {}", e.getMessage());
        }

        fybxd.setFsffqlc("否");
        fybxd.setFlczt("流程在办");
        fybxd.setFbxdlx("检查员报销单");
        fybxd.setFbxlx("检查员报销");

        fybxd.setFbxdzt(JcyFybxdConstant.getFirstState());
        spcyJcyFybxdService.save(fybxd);
        // 同意选派人员
        List<SpcySqsxXpjl> tyXpList = spcySqsxXpjlService.getTyXpXpjlList(sqsxid, null);
        initJcyFybxdGrjl(tyXpList, fybxd); // 初始化同意选派人员-报销单个人记录

    }

    /**
     * 数据修订-同步新增报销人员记录
     * */
    public void syncBxryWithSjxd(String sqsxid){
        List<SpcyJcyFybxd> bxdList = spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>()
                .eq(SpcyJcyFybxd::getFsqsxid, sqsxid));
        if (CollectionUtil.isEmpty(bxdList)){
            return;
        }

        // 同意选派人员
        List<SpcySqsxXpjl> tyXpList = spcySqsxXpjlService.getTyXpXpjlList(sqsxid, null);
        initJcyFybxdGrjl(tyXpList, bxdList.get(0)); // 初始化同意选派人员-报销单个人记录
    }

    /**
     * 初始化费用报销单-检查员个人记录
     * @param tyXpList 同意选派人员
     * @param fybxd 费用报销单
     */
    private void initJcyFybxdGrjl(List<SpcySqsxXpjl> tyXpList, SpcyJcyFybxd fybxd){
        for (int order = 0; order < tyXpList.size(); order++){
            YcSysUser user = sysUserService.getById(tyXpList.get(order).getFuserid());
            if (user != null) {
                initFybxdGrjl(user, fybxd, tyXpList.get(order).getFzpsj(), tyXpList.get(order).getFssk());
            }
        }
    }

    /**
     * 初始化费用报销单-新增人员个人记录
     * @param user 用户
     * @param fybxd 报销单
     * @param fpjsj 派检时间
     * @param fjcsf 检查身份(组长/组员/预备检查员)
     */
    private void initFybxdGrjl(YcSysUser user, SpcyJcyFybxd fybxd, Date fpjsj, String fjcsf){
        List<SpcyJcyFybxdgrjl> mxList = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fybxd.getId())
                .eq(SpcyJcyFybxdgrjl::getFuserid, user.getId()));
        if (CollectionUtil.isNotEmpty(mxList)){
            return;
        }

        SpcyJcyFybxdgrjl bxdGrjl = new SpcyJcyFybxdgrjl();
        bxdGrjl.setId(GetUuIdUtils.ReplaceUuId());
        bxdGrjl.setFsqsxid(fybxd.getFsqsxid());
        bxdGrjl.setFbxdid(fybxd.getId());
        bxdGrjl.setFuserid(user.getId());

        bxdGrjl.setRealname(user.getRealname());
        bxdGrjl.setSex(user.getSex());
        bxdGrjl.setFsfzh(user.getFsfzh());
        bxdGrjl.setPhone(user.getPhone());
        bxdGrjl.setFgzdw(user.getFgzdw());

        // 银行卡
        bxdGrjl.setFkfh(user.getFkfh());
        bxdGrjl.setFyhkh(user.getFyhkh());
        bxdGrjl.setFkhhszd(user.getFkhhszd());

        // 公务卡
        bxdGrjl.setFgwkh(user.getFgwkh());
        bxdGrjl.setFgwkkhh(user.getFgwkkhh());
        bxdGrjl.setFgwkszd(user.getFgwkszd());

        bxdGrjl.setFpjks(fybxd.getFjbks());
        bxdGrjl.setFpjksid(fybxd.getFjbksid());
        bxdGrjl.setFpjr(fybxd.getFjbr());
        bxdGrjl.setFpjrid(fybxd.getFjbrid());

        bxdGrjl.setFpjsj(fpjsj);
        if (StringUtils.isNotBlank(fjcsf)) {
            bxdGrjl.setFjcsf(fjcsf);
        }else {
            bxdGrjl.setFjcsf("无");
        }

        /**
         * 劳务费实报金额
         * 组长350/天
         * 组员300/天
         * 预备检查员 0/天
         * 观察员 0/天
         * */
        int hsbzts = 0;  // 伙食补助天数 默认按检查天数+1，观察员0天后面金额也为哦0
        int snjtbzts = 0; // 市内交通补助天数 默认按检查天数+1，观察员0天后面金额也为0

        int lwfts = 0; // 劳务费天数 默认按检查天数，观察员0天后面金额也为0
        int zxfts = 0; // // 住宿费天数  默认按检查天数

        String lwfsbje = "0";
        String zxfybje = "0";
        if (StringUtils.isNotBlank(bxdGrjl.getFjcsf())) {
            if (bxdGrjl.getFjcsf().contains(SpcyConstant.HCY_SSK_ZZ)) {
                lwfts = fybxd.getFjcts();
//                lwfsbje = String.valueOf(fybxd.getFjcts() * 350);
                bxdGrjl.setFlwfbz("350"); // 劳务费标准
                bxdGrjl.setFhsbzbz("100"); // 伙食补助标准
                bxdGrjl.setFsnjtbzbz("80"); // 市内交通补助标准

                hsbzts = fybxd.getFjcts() + 1;
                snjtbzts = fybxd.getFjcts() + 1;

            } else if (bxdGrjl.getFjcsf().contains(SpcyConstant.HCY_SSK_ZY)) {
                lwfts = fybxd.getFjcts();
//                lwfsbje = String.valueOf(fybxd.getFjcts() * 300);
                bxdGrjl.setFlwfbz("300"); // 劳务费标准
                bxdGrjl.setFhsbzbz("100"); // 伙食补助标准
                bxdGrjl.setFsnjtbzbz("80"); // 市内交通补助标准

                hsbzts = fybxd.getFjcts() + 1;
                snjtbzts = fybxd.getFjcts() + 1;

            }else if (bxdGrjl.getFjcsf().contains(SpcyConstant.HCY_SSK_YB)){
                lwfts = fybxd.getFjcts();
                bxdGrjl.setFlwfbz("0"); // 劳务费标准
                bxdGrjl.setFhsbzbz("100"); // 伙食补助标准
                bxdGrjl.setFsnjtbzbz("80"); // 市内交通补助标准

            }
            else {
                bxdGrjl.setFlwfbz("0"); // 劳务费标准
                bxdGrjl.setFhsbzbz("0"); // 伙食补助标准
                bxdGrjl.setFsnjtbzbz("0"); // 市内交通补助标准
            }
        }else {
            bxdGrjl.setFlwfbz("0"); // 劳务费标准
            bxdGrjl.setFhsbzbz("0"); // 伙食补助标准
            bxdGrjl.setFsnjtbzbz("0"); // 市内交通补助标准
        }
        zxfts = lwfts + 1;

        bxdGrjl.setFlwfts(lwfts);
        /** 为0，默认为空 */
        bxdGrjl.setFlwfsbje(StringPatternUtils.emptyZeroByString(lwfsbje));

        bxdGrjl.setFhsbzts(hsbzts); // 伙食补助天数 默认按检查天数+1，观察员0天后面金额也为哦0
        bxdGrjl.setFhsbzsbje(StringPatternUtils.emptyZeroByString(String.valueOf(bxdGrjl.getFhsbzts()*100))); // 伙食补助天数 检查员100/天 观察员0/天

        bxdGrjl.setFsnjtbzts(snjtbzts); // 市内交通补助天数 默认按检查天数+1，观察员0天后面金额也为0
        bxdGrjl.setFsnjtbzje(StringPatternUtils.emptyZeroByString(String.valueOf(bxdGrjl.getFsnjtbzts()*80)));  // 市内交通补助金额 检查员80/天 观察员0/天

        bxdGrjl.setFcsjjtfs(JcyFybxdConstant.CSJJTFS_DEFAULT_GGJT); // 城市间交通方式  单位派车/无单位派车/公共交通 （默认公共交通，如果选其他不需要填后面的城市间交通费字段）

        bxdGrjl.setFwjtfsfdf(JcyFybxdConstant.FYBXD_SFDF_NO); // 城市间交通费-往-是否垫付 否/是（默认否，选是必填垫付人）
        bxdGrjl.setFwjtfdfrid(""); // 城市间交通费-往-垫付人id 从本次审评查验费用报销个人记录选择人员id
        bxdGrjl.setFwjtfqscs(""); // 城市间交通费-往-起始城市 可选全国的城市，前面14个显示广西地市
        bxdGrjl.setFwjtfddcs(""); // 城市间交通费-往-到达城市 可选全国的城市，前面14个显示广西地市
        bxdGrjl.setFwjtfsbje(""); // 城市间交通费-往-实报金额 如果本人选择是垫付 实报金额为0，把本人的合计金额加到垫付人的实报金额
        bxdGrjl.setFwjtfybje(""); // 城市间交通费-往-应报金额 手填

        bxdGrjl.setFfjtfsfdf(JcyFybxdConstant.FYBXD_SFDF_NO); // 城市间交通费-返-是否垫付 否/是（默认否，选是必填垫付人）
        bxdGrjl.setFfjtfdfrid(""); // 城市间交通费-返-垫付人id 从本次审评查验费用报销个人记录选择人员id
        bxdGrjl.setFfjtfqscs(""); // 城市间交通费-返-起始城市 可选全国的城市，前面14个显示广西地市
        bxdGrjl.setFfjtfddcs(""); // 城市间交通费-返-到达城市 可选全国的城市，前面14个显示广西地市
        bxdGrjl.setFfjtfybje(""); // 城市间交通费-返-应报金额 手填
        bxdGrjl.setFfjtfsbje(""); // 城市间交通费-返-实报金额 如果本人选择是垫付 实报金额为0，把本人的合计金额加到垫付人的实报金额

        bxdGrjl.setFzxfts(zxfts); // 住宿费天数  默认按检查天数
        bxdGrjl.setFzxfsfdf(JcyFybxdConstant.FYBXD_SFDF_NO); // 住宿费是否垫付 否/是（默认否，选是必填垫付人）
        bxdGrjl.setFzxfdfrid(""); // 住宿费垫付人id 从本次审评查验费用报销个人记录选择人员id
        bxdGrjl.setFzxfybje(StringPatternUtils.emptyZeroByString(zxfybje)); // 住宿费应报金额 手填
        bxdGrjl.setFzxfsbje(StringPatternUtils.emptyZeroByString(zxfybje)); // 住宿费实报金额 如果本人选择是垫付 实报金额为0，把本人的合计金额加到垫付人的实报金额

        /**
         * 差旅费应报合计金额 = 伙食补助实报金额+城市间交通费-往-合计金额+城市间交通费-返-合计金额+住宿费合计金额
         * 差旅费实报合计金额 = 伙食补助实报金额+城市间交通费-往-实报金额+城市间交通费-返-实报金额+住宿费实报金额
         */
        bxdGrjl.setFclfybhjje("");
        bxdGrjl.setFclfsbhjje("");

        spcyJcyFybxdgrjlService.save(bxdGrjl);

        /** 会议登记人员 */
        SpcySqsxHydjry hydjry = new SpcySqsxHydjry();
        BeanUtil.copyProperties(bxdGrjl, hydjry);
        spcySqsxHydjryService.save(hydjry);
    }

    /**
     * 初始化申请事项会议登记人员
     */
    private SpcySqsxHydjry initSqsxHydjry(YcSysUser user, String sqsxid, String fjcsf){
        List<SpcySqsxHydjry> mxList = spcySqsxHydjryService.list(new LambdaQueryWrapper<SpcySqsxHydjry>()
                .eq(SpcySqsxHydjry::getFsqsxid, sqsxid)
                .eq(SpcySqsxHydjry::getFuserid, user.getId()));
        if (CollectionUtil.isNotEmpty(mxList)){
            return mxList.get(0);
        }

        SpcySqsxHydjry bxdGrjl = new SpcySqsxHydjry();
        bxdGrjl.setId(GetUuIdUtils.ReplaceUuId());
        bxdGrjl.setFsqsxid(sqsxid);
        bxdGrjl.setFuserid(user.getId());

        bxdGrjl.setRealname(user.getRealname());
        bxdGrjl.setSex(user.getSex());
        bxdGrjl.setFsfzh(user.getFsfzh());
        bxdGrjl.setPhone(user.getPhone());
        bxdGrjl.setFgzdw(user.getFgzdw());

        // 银行卡
        bxdGrjl.setFkfh(user.getFkfh());
        bxdGrjl.setFyhkh(user.getFyhkh());
        bxdGrjl.setFkhhszd(user.getFkhhszd());

        // 公务卡
        bxdGrjl.setFgwkh(user.getFgwkh());
        bxdGrjl.setFgwkkhh(user.getFgwkkhh());
        bxdGrjl.setFgwkszd(user.getFgwkszd());

        if (StringUtils.isNotBlank(fjcsf)) {
            bxdGrjl.setFjcsf(fjcsf);
        }else {
            bxdGrjl.setFjcsf("无");
        }

        spcySqsxHydjryService.save(bxdGrjl);

        return bxdGrjl;
    }

    /**
     * 同步删除报销人员记录及现场检查会议登记人员
     * */
    public void syncDelBxryAndDjry(String sqsxid, String fuserid){
        // 删除报销人员
        spcyJcyFybxdgrjlService.remove(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFsqsxid, sqsxid)
                .eq(SpcyJcyFybxdgrjl::getFuserid, fuserid));

        // 删除会议登记人员
        spcySqsxHydjryService.remove(new LambdaQueryWrapper<SpcySqsxHydjry>()
                .eq(SpcySqsxHydjry::getFsqsxid, sqsxid)
                .eq(SpcySqsxHydjry::getFuserid, fuserid));

    }


    /**
     * 删除费用报销单及明细
     * @param fbxdid
     */
    public void deleteFybxdAndRymx(String fbxdid){
        if (StringUtils.isBlank(fbxdid)){
            throw new BusinessException("参数为空！");
        }
        SpcyJcyFybxd bean = spcyJcyFybxdService.getById(fbxdid);
        if (bean == null){
            throw new BusinessException("没有相匹配的数据！");
        }

        spcyJcyFybxdService.removeById(fbxdid);
        spcyJcyFybxdgrjlService.remove(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid));

        String log = LogUtils.MapToStringMethod(ObjectToMapUtils.objectToMap(bean));
        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD, log, fbxdid, "删除检查员费用报销单及明细",SpcyConstant.LOGS_SYS_TYPE_SC);
    }

    /**
     * 查询费用报销单-分页列表
     */
    public HttpResult queryFybxdPageList(SpcyJcyFybxd fybxd, String gjz, boolean isSelectMy, PageVo pageVo, OrderItemVo orderItemVo){
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<SpcyJcyFybxd> page = new Page<>(pageVo.getPageNo(), pageVo.getPageSize());

        if (isSelectMy){
            Page<SpcyJcyFybxd> pageList = spcyJcyFybxdMapper.selectFybxdPageList(page, gjz, GetCurrentUserUtils.getCurrentUserId(), fybxd, orderItemVo);

            return HttpResult.ok(pageList);
        }else {
            LambdaQueryWrapper<SpcyJcyFybxd> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.like(StringUtils.isNotBlank(fybxd.getFjcsxmc()), SpcyJcyFybxd::getFjcsxmc, fybxd.getFjcsxmc());

            if (StringUtils.isNotBlank(gjz)) {
                queryWrapper
                        .and(f -> f.like(SpcyJcyFybxd::getFbxnrms, gjz)
                                .or()
                                .like(SpcyJcyFybxd::getFjbr, gjz)
                                .or()
                                .like(SpcyJcyFybxd::getFjbks, gjz)
                                .or()
                                .like(SpcyJcyFybxd::getFjcsxmc, gjz)
                                .or()
                                .like(SpcyJcyFybxd::getFjcqymc, gjz)
                                .or()
                                .like(SpcyJcyFybxd::getFqydz, gjz)
                        );
            }
            Page<SpcyJcyFybxd> pageList = spcyJcyFybxdService.page(page, queryWrapper);

            return HttpResult.ok(pageList);
        }
    }

    /**
     * 查询报销单列表-根据sqsxid
     */
    public List<SpcyJcyFybxd> queryBxdListBySqsxId(String sqsxid){
        if (StringUtils.isBlank(sqsxid)){
            throw new BusinessException("申请事项参数为空！");
        }

        List<SpcyJcyFybxd> bxdList = spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>()
                .eq(SpcyJcyFybxd::getFsqsxid, sqsxid));
        if (CollectionUtil.isEmpty(bxdList)) {
            initSqsxFybxd(sqsxid);
        }

        return spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>()
                .eq(SpcyJcyFybxd::getFsqsxid, sqsxid)
                .orderByAsc(SpcyJcyFybxd::getCreateTime));
    }

    /**
     * 查询报销人员信息列表-根据sqsxid
     * @param sqsxid
     */
    public Map queryBxryxxListBySqsxId(String sqsxid){

        SpcyJcyFybxd fybxd = null;
        List<SpcyJcyFybxd> bxdList = spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>()
                .eq(SpcyJcyFybxd::getFsqsxid, sqsxid));
        if (CollectionUtil.isEmpty(bxdList)) {
            initSqsxFybxd(sqsxid);

            List<SpcyJcyFybxd> bxdList2 = spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>()
                    .eq(SpcyJcyFybxd::getFsqsxid, sqsxid));
            fybxd = bxdList2.get(0);
        }else {
            fybxd = bxdList.get(0);
        }

        Map resultMap = new HashMap();

        resultMap.put("bxd", fybxd);
        resultMap.put("bxmxList", this.queryBxryjlBySqsxId(sqsxid));

        return resultMap;
    }

    /**
     * 查询报销人员信息列表-根据申请事项id
     * @param sqsxid
     */
    public List<SpcyJcyFybxdgrjl> queryBxryjlBySqsxId(String sqsxid){
        return spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFsqsxid, sqsxid)
                .last("order by instr ('组长,组员,预备检查员,观察员', fjcsf)"));
    }

    /**
     * 查询会议登记人员信息列表-根据申请事项id
     * @param sqsxid
     */
    public List<SpcySqsxHydjry> queryHydjryBySqsxId(String sqsxid){
        return spcySqsxHydjryService.list(new LambdaQueryWrapper<SpcySqsxHydjry>()
                .eq(SpcySqsxHydjry::getFsqsxid, sqsxid)
                .last("order by instr ('组长,组员,预备检查员,观察员', fjcsf)"));
    }

    /**
     * 查询报销人员信息列表-根据报销单id
     * @param bxdid
     */
    public List<SpcyJcyFybxdgrjl> queryBxryxxListByBxdId(String bxdid){
        return spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, bxdid)
                .last("order by instr ('组长,组员,预备检查员,观察员', fjcsf), create_time asc"));
    }

    /**
     * 查询专家劳务费列表-根据报销单id
     * @param bxdid
     */
    public List<SpcyJcyFybxdgrjl> queryZjlwfList(String bxdid){
        List<SpcyJcyFybxdgrjl> list = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, bxdid)
                .eq(SpcyJcyFybxdgrjl::getFlwfsfjgs, JcyFybxdConstant.FYBXD_LWFSFJGS_YES)
                .orderByAsc(SpcyJcyFybxdgrjl::getCreateTime));

        return list;
    }

    /**
     * 查询当前记录的对应垫付人员列表
     * @param fbxdid 报销单id
     * @param id 报销人员记录id
     */
    public List<Map> queryFybxdDfryList(String fbxdid, String id){

        List<Map> resultList = new ArrayList<>();

        List<SpcyJcyFybxdgrjl> list = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid)
                .ne(StringUtils.isNotBlank(id), SpcyJcyFybxdgrjl::getId, id));
        if (CollectionUtil.isNotEmpty(list)) {
            for (SpcyJcyFybxdgrjl b : list) {
                Map dataMap = new HashMap();
                dataMap.put("id", b.getFuserid());
                dataMap.put("realname", b.getRealname());
                dataMap.put("fjcsf", b.getFjcsf());
                dataMap.put("sex", b.getSex());
                dataMap.put("fgzdw", b.getFgzdw());
                dataMap.put("phone", b.getPhone());
                resultList.add(dataMap);
            }
        }

        return resultList;
    }

    /**
     * 新增报销人员用户信息
     */
    public HttpResult addBxryUserInfo(AddJcyBxryInfoVo bean) throws InvocationTargetException, IllegalAccessException {
        /*if (StringUtils.isBlank(bean.getFbxdid())){
            throw new BusinessException("参数为空!");
        }*/

        SpcyJcyFybxd fybxd = null;
        if (StringUtils.isBlank(bean.getFbxdid())){
            if (StringUtils.isBlank(bean.getSqsxid())){
                return HttpResult.error("操作失败，事项参数为空！");
            }

            List<SpcyJcyFybxd> list = spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>().eq(SpcyJcyFybxd::getFsqsxid, bean.getSqsxid()));
            if (CollectionUtil.isEmpty(list)){
                return HttpResult.error("操作失败，没有相匹配的报销数据！");
            }
            fybxd = list.get(0);

        }else {
            fybxd = spcyJcyFybxdService.getById(bean.getFbxdid());
            if (fybxd == null){
                return HttpResult.error("操作失败，没有相匹配的报销数据！");
            }
        }


        if (StringUtils.isBlank(bean.getRealname())){
            return HttpResult.error("操作失败，姓名为空！");
        }

        if (StringUtils.isBlank(bean.getFsfzh())){
            return HttpResult.error("操作失败，身份证号为空！");
        }

        if (StringUtils.isBlank(bean.getPhone())){
            return HttpResult.error("操作失败，手机号为空！");
        }

        if (StringUtils.isBlank(bean.getFgzdw())){
            return HttpResult.error("操作失败，工作单位为空！");
        }

        String realname = StringPatternUtils.trimString(bean.getRealname());
        String fsfzh = StringPatternUtils.trimString(bean.getFsfzh());
        String phone = StringPatternUtils.trimString(bean.getPhone());

        // 验证身份证号
        List<YcSysUser> sfzhUserList = sysUserService.selectUserBySfzh(fsfzh);
        if (CollectionUtil.isNotEmpty(sfzhUserList)){
            return HttpResult.error("操作失败，身份证号已经存在！");
        }

        // 验证手机号
        List<YcSysUser> phoneUserList = sysUserService.selectUserBySfzh(fsfzh);
        if (CollectionUtil.isNotEmpty(phoneUserList)){
            return HttpResult.error("操作失败，手机号已经存在！");
        }

        String id = GetUuIdUtils.ReplaceUuId();
        YcSysUser user = new YcSysUser();
        user.setId(id);
        BeanUtils.copyProperties(user, bean);
        user.setRealname(realname);
        user.setFsfzh(fsfzh);
        user.setPhone(phone);

        // 解析身份证号获取出生年月
        try {
            Date birthDayFromIdCard = DateConversionUtils.getBirthDayFromIdCard(fsfzh);
            if (birthDayFromIdCard != null){
                user.setBirthday(birthDayFromIdCard);
            }
        } catch (ParseException e) {
            log.error("身份证解析失败！");
        }

        // 获取性别
        int sex = DateConversionUtils.getSexFromIdCard(fsfzh);
        user.setSex(sex);

        user.setCreateTime(new Date());
        user.setDelFlag(SysUserConstant.DEL_FLAG_YES);
        user.setStatus(SysUserConstant.STATUS_YES);
        sysUserService.save(user);

        initFybxdGrjl(user, fybxd, null, bean.getFjcsf());

        String operContent = "删除：";
        operContent += LogUtils.MapToStringMethod(ObjectToMapUtils.objectToMap(user));

        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD,operContent,bean.getSqsxid(),"新增费用报销单人员用户信息", SpcyConstant.LOGS_SYS_TYPE_XZ);

//        return user;
        return HttpResultVo.HttpResultSave(user,"添加成功");
    }

    /**
     * 新增会议登记人员用户信息
     */
    public HttpResult addHydjryUserInfo(AddJcyBxryInfoVo bean) throws InvocationTargetException, IllegalAccessException {

        if (StringUtils.isBlank(bean.getSqsxid())){
            return HttpResult.error("操作失败，事项参数为空！");
        }

        if (StringUtils.isBlank(bean.getRealname())){
            return HttpResult.error("操作失败，姓名为空！");
        }

        if (StringUtils.isBlank(bean.getFsfzh())){
            return HttpResult.error("操作失败，身份证号为空！");
        }

        if (StringUtils.isBlank(bean.getPhone())){
            return HttpResult.error("操作失败，手机号为空！");
        }

        if (StringUtils.isBlank(bean.getFgzdw())){
            return HttpResult.error("操作失败，工作单位为空！");
        }

        String realname = StringPatternUtils.trimString(bean.getRealname());
        String fsfzh = StringPatternUtils.trimString(bean.getFsfzh());
        String phone = StringPatternUtils.trimString(bean.getPhone());

        // 验证身份证号
        List<YcSysUser> sfzhUserList = sysUserService.selectUserBySfzh(fsfzh);
        if (CollectionUtil.isNotEmpty(sfzhUserList)){
            return HttpResult.error("操作失败，身份证号已经存在！");
        }

        // 验证手机号
        List<YcSysUser> phoneUserList = sysUserService.selectUserBySfzh(fsfzh);
        if (CollectionUtil.isNotEmpty(phoneUserList)){
            return HttpResult.error("操作失败，手机号已经存在！");
        }

        String id = GetUuIdUtils.ReplaceUuId();
        YcSysUser user = new YcSysUser();
        ConvertUtils.register(new DateConvert(), java.util.Date.class);
        BeanUtil.copyProperties(bean, user);
        user.setId(id);
        user.setRealname(realname);
        user.setFsfzh(fsfzh);
        user.setPhone(phone);

        // 解析身份证号获取出生年月
        try {
            Date birthDayFromIdCard = DateConversionUtils.getBirthDayFromIdCard(fsfzh);
            if (birthDayFromIdCard != null){
                user.setBirthday(birthDayFromIdCard);
            }
        } catch (ParseException e) {
            log.error("身份证解析失败！");
        }

        // 获取性别
        int sex = DateConversionUtils.getSexFromIdCard(fsfzh);
        user.setSex(sex);

        user.setCreateTime(new Date());
        user.setDelFlag(SysUserConstant.DEL_FLAG_YES);
        user.setStatus(SysUserConstant.STATUS_YES);
        sysUserService.save(user);

        SpcySqsxHydjry hydjry = initSqsxHydjry(user, bean.getSqsxid(), bean.getFjcsf());

        String operContent = "新增信息：";
        operContent += LogUtils.MapToStringMethod(ObjectToMapUtils.objectToMap(user));

        spcyLogService.addLogs(LogConstant.LOGS_SQSX_HY,operContent,bean.getSqsxid(),"新增会议登记人员用户信息", SpcyConstant.LOGS_SYS_TYPE_XZ);

        return HttpResultVo.HttpResultSave(hydjry,"添加成功");
    }

    /**
     * 查询可选择人员列表
     */
    public HttpResult queryKSelectUserPageList(YcSysUser query,String gjz, PageVo pageVo){
        return HttpResult.ok(sysUserService.getFybxdUserPageList(query,gjz,pageVo));
    }

    /**
     * 保存选择报销单-报销人员
     */
    public HttpResult saveSelectBxry(String ids, String fbxdid, String sqsxid, String fjcsf){
        if (StringUtils.isBlank(ids)){
            return HttpResult.error("请选择人员为空！");
        }

        SpcyJcyFybxd fybxd = null;

        if (StringUtils.isNotBlank(fbxdid)) {
            fybxd = spcyJcyFybxdService.getById(fbxdid);

            if (fybxd == null) {
                return HttpResult.error("没有相匹配的报销数据！");
            }
        }else {
            if (StringUtils.isBlank(sqsxid)){
                return HttpResult.error("事项参数为空！");
            }

            if (StringUtils.isNotBlank(sqsxid)) {
                List<SpcyJcyFybxd> list = spcyJcyFybxdService.list(new LambdaQueryWrapper<SpcyJcyFybxd>()
                        .eq(SpcyJcyFybxd::getFsqsxid, sqsxid));
                if (CollectionUtil.isEmpty(list)) {
                    return HttpResult.error("没有相匹配的报销数据！");
                }else {
                    fybxd = list.get(0);
                }
            }
        }

        List<YcSysUser> userList = sysUserService.listByIds(StringPatternUtils.getListByIds(ids));
        if (CollectionUtil.isEmpty(userList)){
            return HttpResult.error("没有相匹配的用户数据！");
        }
        for (YcSysUser user : userList) {
            initFybxdGrjl(user, fybxd, null, fjcsf);
        }

        return HttpResult.ok("操作成功");
    }

    /**
     * 保存选择会议登记人员
     */
    public HttpResult saveSelectHydjry(String ids, String fbxdid, String sqsxid, String fjcsf){
        if (StringUtils.isBlank(ids)){
            return HttpResult.error("请选择人员为空！");
        }

        if (StringUtils.isBlank(sqsxid)){
            return HttpResult.error("事项参数为空！");
        }

        List<YcSysUser> userList = sysUserService.listByIds(StringPatternUtils.getListByIds(ids));
        if (CollectionUtil.isEmpty(userList)){
            return HttpResult.error("没有相匹配的用户数据！");
        }
        for (YcSysUser user : userList) {
            initSqsxHydjry(user, sqsxid, fjcsf);
        }

        return HttpResult.ok("操作成功");
    }

    /**
     * 更新报销人员明细
     */
    public void updateBxd(HashMap<String,String> buffer) throws IllegalAccessException, InvocationTargetException {
        String id = buffer.get("id");
        if (StringUtils.isBlank(id)){
            throw new BusinessException("参数为空！");
        }

        SpcyJcyFybxd updateBean = spcyJcyFybxdService.getById(id);
        if (updateBean == null){
            throw new BusinessException("没有相匹配数据！");
        }

        Map<String, Object> oldMap = ObjectToMapUtils.objectToMap(updateBean);

        ConvertUtils.register(new DateConvert(), java.util.Date.class);
        // 自动完成页面到bean的数据对接
        BeanUtils.populate(updateBean, buffer);

        updateBean.setUpdateTime(new Date());
        updateBean.setUpdateBy(GetCurrentUserUtils.getCurrentUserAccount());
        spcyJcyFybxdService.updateById(updateBean);

        String operContent = "基本信息修改：";
        operContent += LogUtils.BeanModifyMsg(updateBean,oldMap);

        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD,operContent,updateBean.getFsqsxid(),"修改费用报销单", SpcyConstant.LOGS_SYS_TYPE_XG);
    }

    /**
     * 更新报销人员明细
     */
    public void updateBxrymxxx(HashMap<String,String> buffer) throws IllegalAccessException, InvocationTargetException {
        String id = buffer.get("id");
        if (StringUtils.isBlank(id)){
            throw new BusinessException("参数为空！");
        }

        SpcyJcyFybxdgrjl updateBean = spcyJcyFybxdgrjlService.getById(id);
        if (updateBean == null){
            throw new BusinessException("没有相匹配数据！");
        }
        SpcyJcyFybxdgrjl oldBean = updateBean;
//        Map<String, Object> oldMap = ObjectToMapUtils.objectToMap(updateBean);

        ConvertUtils.register(new DateConvert(), java.util.Date.class);
        // 自动完成页面到bean的数据对接
        BeanUtils.populate(updateBean, buffer);

        // 不为公共交通，相关字段全部置空
        if (StringUtils.isNotBlank(updateBean.getFcsjjtfs())
                && updateBean.getFcsjjtfs().equals(JcyFybxdConstant.CSJJTFS_DEFAULT_DWPC)){
            updateBean.setFwjtfsfdf(JcyFybxdConstant.FYBXD_SFDF_NO);
            updateBean.setFwjtfsbje("0");
            updateBean.setFwjtfybje("0");

            updateBean.setFwjtfdfrid("");
            updateBean.setFwjtfdfrxm("");
            updateBean.setFwjtfqscs("");
            updateBean.setFwjtfddcs("");

            updateBean.setFfjtfsfdf(JcyFybxdConstant.FYBXD_SFDF_NO);
            updateBean.setFfjtfsbje("0");
            updateBean.setFfjtfybje("0");

            updateBean.setFfjtfdfrid("");
            updateBean.setFfjtfdfrxm("");
            updateBean.setFfjtfqscs("");
            updateBean.setFfjtfddcs("");
        }

        // 劳务费
        int lwfts = Optional.ofNullable(updateBean.getFlwfts()).orElseGet(()->0);
        // 伙食补助
        int hsbzts = Optional.ofNullable(updateBean.getFhsbzts()).orElseGet(()->0);
        // 市内交通补助
        int snjtbzts = Optional.ofNullable(updateBean.getFsnjtbzts()).orElseGet(()->0);

        /** 计算劳务费、伙食补助、市内交通补助金额 */
        updateBean = jsBxdmxLwfHsfJtbz(updateBean, lwfts, hsbzts, snjtbzts);

        if (StringUtils.isNotBlank(updateBean.getFfjtfsfdf()) && updateBean.getFfjtfsfdf().equals("否")){
            updateBean.setFfjtfdfrid("");
            updateBean.setFfjtfdfrxm("");
        }

        if (StringUtils.isNotBlank(updateBean.getFwjtfsfdf()) && updateBean.getFwjtfsfdf().equals("否")){
            updateBean.setFwjtfdfrid("");
            updateBean.setFwjtfdfrxm("");
        }

        if (StringUtils.isNotBlank(updateBean.getFzxfsfdf()) && updateBean.getFzxfsfdf().equals("否")){
            updateBean.setFzxfdfrid("");
            updateBean.setFzxfdfrxm("");
        }

        if (StringUtils.isNotBlank(updateBean.getFfjtfdfrid())) {
            updateBean.setFfjtfdfrxm(Optional.ofNullable(sysUserService.findRealnameById(updateBean.getFfjtfdfrid())).orElseGet(()->""));
        }
        if (StringUtils.isNotBlank(updateBean.getFwjtfdfrid())) {
            updateBean.setFwjtfdfrxm(Optional.ofNullable(sysUserService.findRealnameById(updateBean.getFwjtfdfrid())).orElseGet(()->""));
        }
        if (StringUtils.isNotBlank(updateBean.getFzxfdfrid())) {
            updateBean.setFzxfdfrxm(Optional.ofNullable(sysUserService.findRealnameById(updateBean.getFzxfdfrid())).orElseGet(()->""));
        }

        updateBean.setUpdateTime(new Date());
        updateBean.setUpdateBy(GetCurrentUserUtils.getCurrentUserAccount());
        boolean flag = spcyJcyFybxdgrjlService.updateById(updateBean);
        if (flag){
            /** 重新计算汇总金额 */
            this.againHzBxd(updateBean.getFbxdid());
        }

        // 同步用户银行卡及公务卡信息
        sysUserService.updateSysYhkOrGwk(oldBean, updateBean);

//        String operContent = "基本信息修改：";
//        operContent += LogUtils.BeanModifyMsg(updateBean,oldMap);

//        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD,operContent,updateBean.getFsqsxid(),"修改费用报销单明细", SpcyConstant.LOGS_SYS_TYPE_XG);
    }

    /**
     * 更新会议登记人员明细
     */
    public void updateHydjrymxxx(HashMap<String,String> buffer) throws IllegalAccessException, InvocationTargetException {
        String id = buffer.get("id");
        if (StringUtils.isBlank(id)){
            throw new BusinessException("参数为空！");
        }

        SpcySqsxHydjry updateBean = spcySqsxHydjryService.getById(id);
        if (updateBean == null){
            throw new BusinessException("没有相匹配数据！");
        }
//        SpcySqsxHydjry oldBean = updateBean;

        ConvertUtils.register(new DateConvert(), java.util.Date.class);
        // 自动完成页面到bean的数据对接
        BeanUtils.populate(updateBean, buffer);

        updateBean.setUpdateTime(new Date());
        updateBean.setUpdateBy(GetCurrentUserUtils.getCurrentUserAccount());
        spcySqsxHydjryService.updateById(updateBean);

    }

    /** 同步报销人员-银行卡或者公务卡 */
    private void syncUserYkhOrGwk(SpcyJcyFybxdgrjl grjl){
        if (grjl == null){
            return;
        }
        if (StringUtils.isBlank(grjl.getFuserid())){
            return;
        }
        boolean flag = false;
        LambdaUpdateWrapper<YcSysUser> updateWrapper = new LambdaUpdateWrapper();
        updateWrapper.eq(YcSysUser::getId, grjl.getFuserid());

        YcSysUser updateUser = new YcSysUser();

        // 银行卡
        if (StringUtils.isNotBlank(grjl.getFyhkh())){
            updateUser.setFyhkh(grjl.getFyhkh());
            flag = true;
        }
        if (StringUtils.isNotBlank(grjl.getFkfh())){
            updateUser.setFkfh(grjl.getFkfh());
            flag = true;
        }
        if (StringUtils.isNotBlank(grjl.getFkhhszd())){
            updateUser.setFkhhszd(grjl.getFkhhszd());
            flag = true;
        }

        // 公务卡
        if (StringUtils.isNotBlank(grjl.getFgwkh())){
            updateUser.setFgwkh(grjl.getFgwkh());
            flag = true;
        }
        if (StringUtils.isNotBlank(grjl.getFgwkkhh())){
            updateUser.setFgwkkhh(grjl.getFgwkkhh());
            flag = true;
        }
        if (StringUtils.isNotBlank(grjl.getFgwkszd())){
            updateUser.setFgwkszd(grjl.getFgwkszd());
            flag = true;
        }

        if (flag) {
            sysUserService.update(updateUser, updateWrapper);
        }

    }

    /**
     * 删除会议登记人员id
     */
    public void deleteHydjryById(String id){
        if (StringUtils.isBlank(id)){
            throw new BusinessException("参数为空！");
        }

        SpcySqsxHydjry updateBean = spcySqsxHydjryService.getById(id);
        if (updateBean == null){
            throw new BusinessException("没有相匹配数据！");
        }

        spcySqsxHydjryService.removeById(id);

        String operContent = "删除：";
        operContent += LogUtils.MapToStringMethod(ObjectToMapUtils.objectToMap(updateBean));

        spcyLogService.addLogs(LogConstant.LOGS_SQSX_HY,operContent,updateBean.getFsqsxid(),"删除会议登记人员id", SpcyConstant.LOGS_SYS_TYPE_SC);

    }

    /**
     * 删除报销人员明细-根据报销人员id
     */
    public void deleteBxrymxById(String fybxdgrjlId){
        if (StringUtils.isBlank(fybxdgrjlId)){
            throw new BusinessException("参数为空！");
        }

        SpcyJcyFybxdgrjl updateBean = spcyJcyFybxdgrjlService.getById(fybxdgrjlId);
        if (updateBean == null){
            throw new BusinessException("没有相匹配数据！");
        }

        spcyJcyFybxdgrjlService.removeById(fybxdgrjlId);

        String operContent = "删除：";
        operContent += LogUtils.MapToStringMethod(ObjectToMapUtils.objectToMap(updateBean));

        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD,operContent,updateBean.getFsqsxid(),"删除费用报销单", SpcyConstant.LOGS_SYS_TYPE_SC);

    }

    /**
     * 报销单信息-查询报销单
     */
    public SpcyJcyFybxd queryBxdById(String fbxdid){
        return spcyJcyFybxdService.getById(fbxdid);
    }

    /**
     * 报销单信息-提交
     */
    public HttpResult submitFybxd(String fbxdid){
        if (StringUtils.isBlank(fbxdid)){
            return HttpResult.error("参数为空！");
        }
        SpcyJcyFybxd bean = spcyJcyFybxdService.getById(fbxdid);
        if (bean == null){
            return HttpResult.error("没有相匹配的数据！");
        }

        String nextState = JcyFybxdConstant.getNextState(bean.getFbxdzt());

        if (nextState.equals(JcyFybxdConstant.STATE_TSSXSQ)){
//            verifyIsExistsFybxdBxryInUserQm(fbxdid); // 验证签名
        }
        else if (nextState.equals(JcyFybxdConstant.STATE_LWF)){

            List<SpcyJcyFybxdtssxsq> tssxsqList = spcyJcyFybxdtssxsqService.list(new LambdaQueryWrapper<SpcyJcyFybxdtssxsq>()
                    .eq(SpcyJcyFybxdtssxsq::getFbxdid, fbxdid));
            if (CollectionUtil.isNotEmpty(tssxsqList)){
                bean.setFsfytssxsq(JcyFybxdConstant.FYBXD_SFYTSSXSQ_YES);
            }else {
                bean.setFsfytssxsq(JcyFybxdConstant.FYBXD_SFYTSSXSQ_NO);
            }

        }else if (nextState.equals(JcyFybxdConstant.STATE_ZSF)){
            syncBxryZxlx(fbxdid); // 同步报销人员-住宿类型

            bean = syncFybxdInYwdwpc(bean, fbxdid); // 同步费用报销单-是否-有无单位派车

        }else if (nextState.equals(JcyFybxdConstant.STATE_HZBD)){
            bean = getHzBxd(bean, fbxdid); // 计算费用

        }else if (nextState.equals(JcyFybxdConstant.STATE_WC)){
            bean = getHzBxd(bean, fbxdid); // 计算费用

            initGenFybxxmmxJl(bean, fbxdid); // 生成报销明细

        }

        bean.setFbxdzt(nextState);

        if (StringUtils.isBlank(bean.getFdjh())) {
            try {
                bean.setFdjh(oaNkRsDjhglService.JcyGetDocumentNumber(bean.getId()));
            } catch (Exception e) {
                log.error("检查员报销单-生成单据号错误: {}", e.getMessage());
            }
        }

        spcyJcyFybxdService.updateById(bean);

        return HttpResult.ok("提交成功");
    }

    /**
     * 报销单信息-退回
     */
    public HttpResult returnFybxd(String fbxdid){
        if (StringUtils.isBlank(fbxdid)){
            return HttpResult.error("参数为空！");
        }

        SpcyJcyFybxd bean = spcyJcyFybxdService.getById(fbxdid);
        if (bean == null){
            return HttpResult.error("没有相匹配的数据！");
        }

        bean.setFbxdzt(JcyFybxdConstant.getPreviousState(bean.getFbxdzt()));
        spcyJcyFybxdService.updateById(bean);

        return HttpResult.ok("返回成功");
    }

    /**
     * 批量设置出行方式
     */
    public void batchSetBxdCxfsByBxdId(String fbxdid, String fcsjjtfs){
        if (StringUtils.isBlank(fbxdid)){
            throw new BusinessException("参数为空！");
        }
        if (StringUtils.isBlank(fcsjjtfs)){
            throw new BusinessException("出行方式为空！");
        }
        List<SpcyJcyFybxdgrjl> list = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid));

        if (CollectionUtil.isNotEmpty(list)) {
            for (SpcyJcyFybxdgrjl grjl : list) {
                grjl.setFcsjjtfs(fcsjjtfs);

                if (fcsjjtfs.equals(JcyFybxdConstant.CSJJTFS_DEFAULT_DWPC)) {
                    grjl.setFfjtfdfrid("");
                    grjl.setFfjtfdfrxm("");
                    grjl.setFfjtfddcs("");
                    grjl.setFfjtfqscs("");
                    grjl.setFfjtfsbje("0");
                    grjl.setFfjtfybje("0");
                    grjl.setFfjtfsfdf(JcyFybxdConstant.FYBXD_SFDF_NO);

                    grjl.setFwjtfdfrid("");
                    grjl.setFwjtfdfrxm("");
                    grjl.setFwjtfddcs("");
                    grjl.setFwjtfqscs("");
                    grjl.setFwjtfsbje("0");
                    grjl.setFwjtfybje("0");
                    grjl.setFwjtfsfdf(JcyFybxdConstant.FYBXD_SFDF_NO);
                }

                spcyJcyFybxdgrjlService.updateById(grjl);
            }
        }

    }

    /**
     * 批量设置劳务费/伙食/交通补助天数
     * @param fbxdid 报销单id
     * @param fjcts 天数
     */
    public void batchSzLwHsJtbzTs(String fbxdid, String fjcts){
        if (StringUtils.isBlank(fbxdid)){
            throw new BusinessException("参数为空！");
        }
        if (StringUtils.isBlank(fjcts)){
            throw new BusinessException("天数为空！");
        }
        Integer jcts = Integer.valueOf(fjcts);
        List<SpcyJcyFybxdgrjl> list = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid));

        if (CollectionUtil.isNotEmpty(list)) {
            for (SpcyJcyFybxdgrjl grjl : list) {

                grjl = jsBxdmxLwfHsfJtbz(grjl, jcts, jcts, jcts);
                grjl.setFlwfts(jcts);
                grjl.setFhsbzts(jcts);
                grjl.setFsnjtbzts(jcts);

                spcyJcyFybxdgrjlService.updateById(grjl);
            }
        }
    }

    /**
     * 同步报销人员-住宿类型
     */
    private void syncBxryZxlx(String fbxdid){
        List<SpcyJcyFybxdgrjl> list = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid));

        if (CollectionUtil.isNotEmpty(list)) {
            for (SpcyJcyFybxdgrjl grjl : list) {
                // 是否存在特殊事项申请
                List<SpcyJcyFybxdtssxsq> tssxsqList = spcyJcyFybxdtssxsqService.list(new LambdaQueryWrapper<SpcyJcyFybxdtssxsq>()
                        .eq(SpcyJcyFybxdtssxsq::getFsqlx, JcyFybxdConstant.FYBXD_TSSXSQ_SQLX_WXF)
                        .like(SpcyJcyFybxdtssxsq::getFwxfsqrid, grjl.getFuserid()));
                if (CollectionUtil.isNotEmpty(tssxsqList)){
                    grjl.setFzxlx(JcyFybxdConstant.FYBXD_BXRY_ZXLX_WX);
                }else {
                    grjl.setFzxlx(JcyFybxdConstant.FYBXD_BXRY_ZXLX_QT);
                }
                spcyJcyFybxdgrjlService.updateById(grjl);
            }
        }
    }

    /**
     * 同步费用报销单-是否-有无单位派车
     */
    private SpcyJcyFybxd syncFybxdInYwdwpc(SpcyJcyFybxd fybxd, String fbxdid){
        StringBuilder qzrid = new StringBuilder();
        StringBuilder qzrxm = new StringBuilder();
        String type = JcyFybxdConstant.FYBXD_SFYWDWPC_NO;

        List<SpcyJcyFybxdgrjl> list = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid)
                .eq(SpcyJcyFybxdgrjl::getFcsjjtfs, JcyFybxdConstant.CSJJTFS_DEFAULT_WDWPC));
        if (CollectionUtil.isNotEmpty(list)){
            type = JcyFybxdConstant.FYBXD_SFYWDWPC_YES;

            for (SpcyJcyFybxdgrjl grjl : list){
                if (!StringPatternUtils.verifryIsEmptyStringBuilder(qzrid)){
                    qzrid.append(",");
                    qzrxm.append(",");
                }

                qzrid.append(grjl.getFuserid());
                qzrxm.append(grjl.getRealname());
            }
        }

        fybxd.setFsfywdwpc(type);
        fybxd.setFwcsjtzssmqzrid(qzrid.toString());
        fybxd.setFwcsjtzssmqzrxm(qzrxm.toString());

        return fybxd;
    }

    /**
     * 验证报销人员-是否填写签名
     */
    private void verifyIsExistsFybxdBxryInUserQm(String fbxdid){
        List<SpcyJcyFybxdgrjl> list = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid));

        if (CollectionUtil.isNotEmpty(list)){
            for (SpcyJcyFybxdgrjl grjl : list) {
                if (StringUtils.isNotBlank(grjl.getFuserid())) {
                    SpcySqsxWjjl signWjjl = spcySqsxWjjlService.downMyUserQm(grjl.getFuserid(), null);
                    if (signWjjl == null){
                        throw new BusinessException("【"+grjl.getRealname()+"】没有上传相关签名附件！");
                    }
                }
            }
        }else {
            throw new BusinessException("报销人员列表为空！");
        }
    }

    /**
     * 重新生成汇总表-对应处理 汇总表单环节进行重新计算
     */
    private void againHzBxd(String fbxdid){
        if (StringUtils.isBlank(fbxdid)){
            return;
        }

        String bxdzt = spcyJcyFybxdMapper.selectFbxdztById(fbxdid);
        if (StringUtils.isBlank(bxdzt)){
            return;
        }

        if (!bxdzt.equals(JcyFybxdConstant.STATE_HZBD)){
            return;
        }

        SpcyJcyFybxd fybxd = new SpcyJcyFybxd();
        fybxd.setFlwfbxje("0");
        fybxd.setFclfbxje("0");
        fybxd.setFhjbxje("0");

        /** 重新计算相关金额 */
        fybxd = this.getHzBxd(fybxd, fbxdid);

        /** 更新相关金额 */
        LambdaUpdateWrapper<SpcyJcyFybxd> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(SpcyJcyFybxd::getId, fbxdid);
        /*SpcyJcyFybxd updateBean = new SpcyJcyFybxd();
        updateBean.setFlwfbxje(fybxd.getFlwfbxje());
        updateBean.setFclfbxje(fybxd.getFclfbxje());
        updateBean.setFhjbxje(fybxd.getFhjbxje());*/
        spcyJcyFybxdService.update(fybxd, updateWrapper);

    }

    /**
     * 生成汇总表（计算劳务费和差旅费 应报、实报和合计金额）
     * @param fybxd
     * @param fbxdid
     * @return
     */
    private SpcyJcyFybxd getHzBxd(SpcyJcyFybxd fybxd, String fbxdid){
        BigDecimal bxd_flwfbxje = new BigDecimal("0");
        BigDecimal bxd_fclfbxje = new BigDecimal("0");
        BigDecimal bxd_hsbz = new BigDecimal("0");
        BigDecimal bxd_csjjtf = new BigDecimal("0");
        BigDecimal bxd_snjtf = new BigDecimal("0");
        BigDecimal bxd_zxf = new BigDecimal("0");

        List<SpcyJcyFybxdgrjl> bxmxList = queryBxryxxListByBxdId(fbxdid);
        if (CollectionUtil.isNotEmpty(bxmxList)){
            for (SpcyJcyFybxdgrjl bxmx : bxmxList){
                // 劳务费
                int lwfts = Optional.ofNullable(bxmx.getFlwfts()).orElseGet(()->0);
                // 伙食补助
                int hsbzts = Optional.ofNullable(bxmx.getFhsbzts()).orElseGet(()->0);
                // 市内交通补助
                int snjtbzts = Optional.ofNullable(bxmx.getFsnjtbzts()).orElseGet(()->0);

                bxmx = jsBxdmxLwfHsfJtbz(bxmx, lwfts, hsbzts, snjtbzts);

                /**
                 * // 城市间交通费-往-实报金额
                 * 如果本人选择是垫付 实报金额为0，把本人的合计金额加到垫付人的实报金额
                 */
                if (StringUtils.isNotBlank(bxmx.getFwjtfsfdf()) && bxmx.getFwjtfsfdf().equals("是")){
                    bxmx.setFwjtfsbje("0");
                }else {
                    bxmx.setFwjtfsbje(bxmx.getFwjtfybje());
                }

                /**
                 *   城市间交通费-返-实报金额
                 *   如果本人选择是垫付 实报金额为0，把本人的合计金额加到垫付人的实报金额
                 */
                if (StringUtils.isNotBlank(bxmx.getFfjtfsfdf()) && bxmx.getFfjtfsfdf().equals("是")){
                    bxmx.setFfjtfsbje("0");
                }else {
                    bxmx.setFfjtfsbje(bxmx.getFfjtfybje());
                }

                /**
                 *  住宿费实报金额
                 * 如果本人选择是垫付 实报金额为0，把本人的合计金额加到垫付人的实报金额
                 */
                if (StringUtils.isNotBlank(bxmx.getFzxfsfdf()) && bxmx.getFzxfsfdf().equals("是")){
                    bxmx.setFzxfsbje("0");
                }else {
                    bxmx.setFzxfsbje(bxmx.getFzxfybje());
                }

                /**
                 * 查询垫付-城市间交通费-往-垫付人id
                 * 计算垫付实报金额
                 */
                List<SpcyJcyFybxdgrjl> wjtfList = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                        .eq(SpcyJcyFybxdgrjl::getFwjtfdfrid, bxmx.getFuserid())
                        .eq(SpcyJcyFybxdgrjl::getFwjtfsfdf, "是"));
                BigDecimal wjtfTotal = new BigDecimal(bxmx.getFwjtfsbje());
                for (SpcyJcyFybxdgrjl w : wjtfList){
                    wjtfTotal = wjtfTotal.add(new BigDecimal(Optional.ofNullable(w.getFwjtfybje()).orElseGet(()->"0")));
                    bxmx.setFwjtfsbje(wjtfTotal.toString());
                }

                /**
                 * 城市间交通费-返-垫付人id
                 * 计算垫付实报金额
                 */
                List<SpcyJcyFybxdgrjl> fjtfList = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                        .eq(SpcyJcyFybxdgrjl::getFfjtfdfrid, bxmx.getFuserid())
                        .eq(SpcyJcyFybxdgrjl::getFfjtfsfdf, "是"));
                BigDecimal fjtfTotal = new BigDecimal(bxmx.getFfjtfsbje());
                for (SpcyJcyFybxdgrjl f : fjtfList){
                    fjtfTotal = fjtfTotal.add(new BigDecimal(Optional.ofNullable(f.getFfjtfybje()).orElseGet(()->"0")));
                    bxmx.setFfjtfsbje(fjtfTotal.toString());
                }

                /**
                 * 住宿费垫付人id
                 * 计算垫付实报金额
                 */
                List<SpcyJcyFybxdgrjl> zxfList = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                        .eq(SpcyJcyFybxdgrjl::getFzxfdfrid, bxmx.getFuserid())
                        .eq(SpcyJcyFybxdgrjl::getFzxfsfdf, "是"));
                BigDecimal zxfTotal = new BigDecimal(bxmx.getFzxfsbje());
                for (SpcyJcyFybxdgrjl z : zxfList){
                    zxfTotal = zxfTotal.add(new BigDecimal(Optional.ofNullable(z.getFzxfybje()).orElseGet(()->"0")));
                    bxmx.setFzxfsbje(zxfTotal.toString());
                }


                /** 差旅费应报合计金额 */
                BigDecimal clfYbje = new BigDecimal("0");
                clfYbje = clfYbje.add(new BigDecimal(bxmx.getFhsbzsbje())); // 伙食补助
                clfYbje = clfYbje.add(new BigDecimal(bxmx.getFsnjtbzje())); // 市内交通

                clfYbje = clfYbje.add(new BigDecimal(bxmx.getFwjtfybje())); // 往-交通费-应报金额
                clfYbje = clfYbje.add(new BigDecimal(bxmx.getFfjtfybje())); // 返-交通费-应报金额
                clfYbje = clfYbje.add(new BigDecimal(bxmx.getFzxfybje())); // 住宿费-应报金额

                bxmx.setFclfybhjje(clfYbje.toString());

                /** 差旅费实报合计金额 */
                BigDecimal clfSbje = new BigDecimal("0");
                clfSbje = clfSbje.add(new BigDecimal(bxmx.getFhsbzsbje())); // 伙食补助
                clfSbje = clfSbje.add(new BigDecimal(bxmx.getFsnjtbzje())); // 伙食补助

                clfSbje = clfSbje.add(new BigDecimal(bxmx.getFwjtfsbje())); // 往-交通费-实报金额
                clfSbje = clfSbje.add(new BigDecimal(bxmx.getFfjtfsbje())); // 返-交通费-实报金额
                clfSbje = clfSbje.add(new BigDecimal(bxmx.getFzxfsbje())); // 住宿费-实报金额

                bxmx.setFclfsbhjje(clfSbje.toString());

                String hj_flwfsbje = bxmx.getFlwfsbje(); // 劳务费合计实报金额
                String hj_fclfsbje = bxmx.getFclfsbhjje(); // 差旅费合计实报金额

                String lwfsqje = "0";
                String lwfgsje = "0";
                String lwfsfjgs = JcyFybxdConstant.FYBXD_LWFSFJGS_NO;
                if (StringUtils.isNotBlank(bxmx.getFlwfsbje())){

                    /**
                     * 应报劳务费 > 800 < 4000
                     * 劳务费税前金额 = （ 应报劳务费 - 160 ）/ 0.8
                     * 个税 = (劳务费税前金额 - 800 ）* 20%
                     */
                    BigDecimal sbjr = new BigDecimal(bxmx.getFlwfsbje());
                    if (sbjr.compareTo(new BigDecimal("800")) == 1){
                        BigDecimal subtract = sbjr.subtract(new BigDecimal("160"));
                        BigDecimal lwfsqjeBd = subtract.divide(new BigDecimal("0.8")); // 劳务费税前金额
                        lwfsqje = lwfsqjeBd.toPlainString(); // 劳务费税前金额

                        lwfgsje = lwfsqjeBd.subtract(sbjr).toPlainString(); // 个税
                        lwfsfjgs = JcyFybxdConstant.FYBXD_LWFSFJGS_YES;

                        hj_flwfsbje = lwfsqje;  // 劳务费 = 劳务费税前金额
                    }
                }else {
                    bxmx.setFlwfsbje("0");
                }
                bxmx.setFlwfgsje(lwfgsje); // 劳务费个税金额
                bxmx.setFlwfsqje(lwfsqje);  // 劳务费税前金额
                bxmx.setFlwfsfjgs(lwfsfjgs); // 是否交个税

                spcyJcyFybxdgrjlService.updateById(bxmx);



                // 城市间交通费小计
                BigDecimal xj_csjjtf = new BigDecimal(bxmx.getFwjtfsbje()).add(new BigDecimal(bxmx.getFfjtfsbje()));
                bxd_csjjtf = bxd_csjjtf.add(xj_csjjtf);

                bxd_snjtf = bxd_snjtf.add(new BigDecimal(bxmx.getFsnjtbzje())); // 市内交通费小计
                bxd_hsbz = bxd_hsbz.add(new BigDecimal(bxmx.getFhsbzsbje())); // 伙食补助小计
                bxd_zxf = bxd_zxf.add(new BigDecimal(bxmx.getFzxfsbje())); // 住宿费小计


                bxd_flwfbxje = bxd_flwfbxje.add(new BigDecimal(hj_flwfsbje)); // 劳务费合计报销金额
                bxd_fclfbxje = bxd_fclfbxje.add(new BigDecimal(hj_fclfsbje)); // 差旅费合计报销金额

            }
        }

        /** 计算报销单-合计劳务费和差旅费 */
        fybxd.setFlwfbxje(bxd_flwfbxje.toString());  // 报销单-劳务费合计报销金额
        fybxd.setFclfbxje(bxd_fclfbxje.toString()); // 报销单-差旅费合计报销金额

        fybxd.setFhsbzxj(bxd_hsbz.toString()); // 伙食补助小计
        fybxd.setFjtfxj(bxd_csjjtf.toString()); // 城市间交通费小计
        fybxd.setFsnjtfxj(bxd_snjtf.toString()); // 市内交通费小计
        fybxd.setFzsfxj(bxd_zxf.toString()); // 住宿费小计

        BigDecimal bxdTotal = new BigDecimal("0");  // 合计报销金额
        bxdTotal = bxdTotal.add(new BigDecimal(bxd_flwfbxje.toString()));
        bxdTotal = bxdTotal.add(new BigDecimal(bxd_fclfbxje.toString()));

        fybxd.setFhjbxje(bxdTotal.toString());

        /** 金额大写 */
        try {
            fybxd.setFhjbxjedx(ChineseMoneyUtils.toChineseMoney(bxdTotal));
        }catch (Exception e){
            log.error("检查员报销单合计计算大写金额错误：{}", e.getMessage());
        }


        return fybxd;
    }

    /**
     * 计算特殊事项申请报销金额
     * @return
     */
    private String jsFybxdTssxsqBxJe(String fbxdid){
        BigDecimal total = new BigDecimal("0");

        List<SpcyJcyFybxdtssxsq> list = spcyJcyFybxdtssxsqService.list(new LambdaQueryWrapper<SpcyJcyFybxdtssxsq>()
                .eq(SpcyJcyFybxdtssxsq::getFbxdid, fbxdid));
        if (CollectionUtil.isNotEmpty(list)){
            for (SpcyJcyFybxdtssxsq sq : list){
                total = total.add(new BigDecimal(Optional.ofNullable(sq.getFsqje()).orElseGet(()->"0")));
            }
        }

        return total.toString();
    }

    /**
     * 计算劳务费/伙食费/交通补助
     * @param bxmx
     * @param lwfts
     * @param hsbzts
     * @param snjtbzts
     * @return
     */
    private SpcyJcyFybxdgrjl jsBxdmxLwfHsfJtbz(SpcyJcyFybxdgrjl bxmx, int lwfts, int hsbzts, int snjtbzts){
        if (StringUtils.isNotBlank(bxmx.getFjcsf())) {
            if (bxmx.getFjcsf().contains(SpcyConstant.HCY_SSK_ZZ)) {
                bxmx.setFlwfsbje(String.valueOf(lwfts * 350)); // 劳务费
                bxmx.setFhsbzsbje(String.valueOf(hsbzts * 100)); // 伙食补助
                bxmx.setFsnjtbzje(String.valueOf(snjtbzts * 80)); // 市内交通补助

            } else if (bxmx.getFjcsf().contains(SpcyConstant.HCY_SSK_ZY)) {
                bxmx.setFlwfsbje(String.valueOf(lwfts * 300)); // 劳务费
                bxmx.setFhsbzsbje(String.valueOf(hsbzts * 100)); // 伙食补助
                bxmx.setFsnjtbzje(String.valueOf(snjtbzts * 80)); // 市内交通补助

            }else if (bxmx.getFjcsf().contains(SpcyConstant.HCY_SSK_YB)){
                bxmx.setFlwfsbje("0"); // 劳务费
                bxmx.setFhsbzsbje(String.valueOf(hsbzts * 100)); // 伙食补助
                bxmx.setFsnjtbzje(String.valueOf(snjtbzts * 80)); // 市内交通补助

            }else {
                bxmx.setFlwfsbje("0");
                bxmx.setFhsbzsbje("0");
                bxmx.setFsnjtbzje("0");
            }
        }else {
            bxmx.setFlwfsbje("0");
            bxmx.setFhsbzsbje("0");
            bxmx.setFsnjtbzje("0");

        }

        // 住宿费 = 劳务费+1
        if (bxmx.getFzxfts() == null){
            bxmx.setFzxfts(lwfts+1);
        }

//        bxmx.setFlwfts(lwfts);
//        bxmx.setFhsbzts(lwfts+1);
//        bxmx.setFsnjtbzts(lwfts+2);
        /*String zxfje = String.valueOf(bxmx.getFzxfts() * 350);
        bxmx.setFzxfybje(zxfje);
        bxmx.setFzxfsbje(zxfje);*/


        return bxmx;
    }

    /**
     * 初始化生成-费用报销项目明细记录
     */
    private void initGenFybxxmmxJl(SpcyJcyFybxd fybxd, String fbxdid) {
        if (StringUtils.isBlank(fbxdid)){
            return;
        }

        // 报销单
        if (fybxd == null) {
            fybxd = spcyJcyFybxdService.getById(fbxdid);
            if (fybxd == null) {
                return;
            }
        }

        // 报销单人员记录
        List<SpcyJcyFybxdgrjl> bxgrjlList = spcyJcyFybxdgrjlService.list(new LambdaQueryWrapper<SpcyJcyFybxdgrjl>()
                .eq(SpcyJcyFybxdgrjl::getFbxdid, fbxdid));

        if (CollectionUtil.isEmpty(bxgrjlList)){
            return;
        }

        // 生成报销项目明细
        for (SpcyJcyFybxdgrjl grjl : bxgrjlList){

            // 同步修改银行卡/公务卡
//            this.syncUserYkhOrGwk(grjl);

            List<String> bxxmflList = CollectionUtil.newArrayList(JcyFybxdConstant.BXXMFL_LWF, JcyFybxdConstant.BXXMFL_CLF);

            SpcyJcyFybxd finalFybxd = fybxd;
            bxxmflList.forEach(e -> {
                SpcyJcyFybxxmmxjl bxmxxm = new SpcyJcyFybxxmmxjl();

                ConvertUtils.register(new DateConvert(), java.util.Date.class);
                try {
                    BeanUtils.copyProperties(bxmxxm, finalFybxd);
                    BeanUtils.populate(bxmxxm, BeanUtils.describe(grjl));
                } catch (IllegalAccessException ex) {
                    log.error("[IllegalAccessException]初始化生成-费用报销项目明细记录: {}", ex.getMessage());
                } catch (InvocationTargetException ex) {
                    log.error("[InvocationTargetException]初始化生成-费用报销项目明细记录: {}", ex.getMessage());
                } catch (NoSuchMethodException ex) {
                    log.error("[NoSuchMethodException]初始化生成-费用报销项目明细记录: {}", ex.getMessage());
                }

                bxmxxm.setFbxxmfl1(e);
                if (e.equals(JcyFybxdConstant.BXXMFL_LWF)) {
                    bxmxxm.setFybhjfy(grjl.getFlwfsbje());
                    bxmxxm.setFsbhjfy(grjl.getFlwfsbje());

                }else if (e.equals(JcyFybxdConstant.BXXMFL_CLF)){
                    bxmxxm.setFybhjfy(grjl.getFclfybhjje());
                    bxmxxm.setFsbhjfy(grjl.getFclfsbhjje());
                }

                bxmxxm.setId(GetUuIdUtils.ReplaceUuId());
                bxmxxm.setFbxdgrjlid(grjl.getId());
                bxmxxm.setFbxdid(finalFybxd.getId());
                bxmxxm.setFsqsxid(finalFybxd.getFsqsxid());
                bxmxxm.setFuserid(grjl.getFuserid());
                spcyJcyFybxxmmxjlService.save(bxmxxm);

            });

        }

    }

    /**
     * 费用报销项目明细记录-分页查询
     */
    public HttpResult queryFybxxmmxPageList(SpcyJcyFybxxmmxjl query, String gjz, PageVo pageVo, OrderItemVo orderItemVo){

        Page<SpcyJcyFybxxmmxjl> page = new Page<>(pageVo.getPageNo(), pageVo.getPageSize());

        LambdaQueryWrapper<SpcyJcyFybxxmmxjl> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(query.getFbxnrms()), SpcyJcyFybxxmmxjl::getFbxnrms, query.getFbxnrms());
        queryWrapper.like(StringUtils.isNotBlank(query.getRealname()), SpcyJcyFybxxmmxjl::getRealname, query.getRealname());
        queryWrapper.like(StringUtils.isNotBlank(query.getFkhh()), SpcyJcyFybxxmmxjl::getFkhh, query.getFkhh());
        queryWrapper.like(StringUtils.isNotBlank(query.getFjcqymc()), SpcyJcyFybxxmmxjl::getFjcqymc, query.getFjcqymc());
        queryWrapper.like(StringUtils.isNotBlank(query.getFjcsxmc()), SpcyJcyFybxxmmxjl::getFjcsxmc, query.getFjcsxmc());
        queryWrapper.like(StringUtils.isNotBlank(query.getFgzdw()), SpcyJcyFybxxmmxjl::getFgzdw, query.getFgzdw());
        queryWrapper.like(StringUtils.isNotBlank(query.getFbxxmfl1()), SpcyJcyFybxxmmxjl::getFbxxmfl1, query.getFbxxmfl1());

        if (StringUtils.isNotBlank(gjz)){
            int selectSex = 3;
            if (gjz.contains("男")){
                selectSex = 1;
            }else if (gjz.contains("女")){
                selectSex = 2;
            }
            Integer finalSelectSex = selectSex;

            queryWrapper
                    .and(f->f.like(SpcyJcyFybxxmmxjl::getRealname, gjz)
                            .or()
                            .like(SpcyJcyFybxxmmxjl::getFbxnrms, gjz)
                            .or()
                            .like(SpcyJcyFybxxmmxjl::getFkhh, gjz)
                            .or()
                            .like(SpcyJcyFybxxmmxjl::getFjcqymc, gjz)
                            .or()
                            .like(SpcyJcyFybxxmmxjl::getFjcsxmc, gjz)
                            .or()
                            .like(SpcyJcyFybxxmmxjl::getFbxxmfl1, gjz)
                            .or()
                            .like(SpcyJcyFybxxmmxjl::getFgzdw, gjz)
                            .or()
                            .eq(SpcyJcyFybxxmmxjl::getSex, finalSelectSex)
                    );
        }

        Page<SpcyJcyFybxxmmxjl> pageList = spcyJcyFybxxmmxjlService.page(page, queryWrapper);

        return HttpResult.ok(pageList);
    }

    /**
     * 特殊事项申请-分页查询
     */
    public HttpResult queryFybxdTssxSqPageList(String fbxdid, PageVo pageVo){
        if (StringUtils.isBlank(fbxdid)){
            fbxdid = "0";
        }
//        Page<SpcyJcyFybxdtssxsq> page = new Page<>(pageVo.getPageNo(), pageVo.getPageSize());

        LambdaQueryWrapper<SpcyJcyFybxdtssxsq> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SpcyJcyFybxdtssxsq::getFbxdid, fbxdid);

        lambdaQueryWrapper.orderByAsc(SpcyJcyFybxdtssxsq::getFsqrq);
        lambdaQueryWrapper.orderByAsc(SpcyJcyFybxdtssxsq::getCreateTime);
        List<SpcyJcyFybxdtssxsq> pageList = spcyJcyFybxdtssxsqService.list(lambdaQueryWrapper);

        return HttpResultVo.HttpResultList(pageList);
    }

    /**
     * 特殊事项申请-根据id查看
     */
    public SpcyJcyFybxdtssxsq queryFybxdTssxSqById(String id){
        if (StringUtils.isBlank(id)){
            throw new BusinessException("参数为空！");
        }
        return spcyJcyFybxdtssxsqService.getById(id);
    }

    /**
     * 新增-特殊事项申请
     */
    public SpcyJcyFybxdtssxsq addFybxdTssxSq(SpcyJcyFybxdtssxsq bean){
        if (StringUtils.isBlank(bean.getFbxdid())){
            throw new BusinessException("参数为空！");
        }

        if (StringUtils.isBlank(bean.getFsqlx())){
            throw new BusinessException("申请类型为空！");
        }

        if (bean.getFsqts() == null){
            bean.setFsqts(0);
        }

        SpcyJcyFybxd bxd = spcyJcyFybxdService.getById(bean.getFbxdid());
        if (bxd == null){
            throw new BusinessException("没有相匹配的数据！");
        }

        // 额外费用
        if (StringUtils.isNotBlank(bean.getFewfybxsqrid())){
            List<YcSysUser> userList = sysUserService.findRealnameListByIds(StringPatternUtils.getListByIds(bean.getFewfybxsqrid()));
            String sqr = "";
            if (CollectionUtil.isNotEmpty(userList)){
                for (YcSysUser user : userList){
                    if (StringUtils.isNotBlank(sqr)){
                        sqr += "," + user.getRealname();
                    }else {
                        sqr += user.getRealname();
                    }
                }
            }
            bean.setFewfybxsqrxm(sqr);
        }

        // 午休
        if (StringUtils.isNotBlank(bean.getFwxfsqrid())){
            List<YcSysUser> userList = sysUserService.findRealnameListByIds(StringPatternUtils.getListByIds(bean.getFwxfsqrid()));
            String sqr = "";
            if (CollectionUtil.isNotEmpty(userList)){
                for (YcSysUser user : userList){
                    if (StringUtils.isNotBlank(sqr)){
                        sqr += "," + user.getRealname();
                    }else {
                        sqr += user.getRealname();
                    }
                }
            }
            bean.setFwxfsqrxm(sqr);
        }

        bean.setId(GetUuIdUtils.ReplaceUuId());

        if (StringUtils.isBlank(bean.getFsqrq())){
            bean.setFsqrq(DateConversionUtils.DateToStringYYYYMMDD(new Date()));
        }

        // 经办科室
        bean.setFsqrid(bxd.getFjbrid());
        bean.setFsqr(bxd.getFjbr());
        bean.setFsqks(bxd.getFjbks());

        if (StringUtils.isNotBlank(bxd.getFsqsxid())) {
            /*SpcySqsxBasic sqsx = spcySqsxBaiscService.getById(bxd.getFsqsxid());
            if (sqsx != null && StringUtils.isNotBlank(sqsx.getFzbr())) {
                YcSysUser zbr = sysUserService.getById(StringPatternUtils.getStringsByIds(sqsx.getFzbr())[0]);
                if (zbr != null) {
                    bean.setFsqrid(zbr.getId());
                    bean.setFsqr(zbr.getRealname());
                    bean.setFsqks(SpcyConstant.getYwclNameByCode(sqsx.getFywflcode()));
                }
            }*/
        }

        /*bean.setFsqrid(GetCurrentUserUtils.getCurrentUserId());
        bean.setFsqr(GetCurrentUserUtils.getCurrentUserName());
        bean.setFsqks(GetCurrentUserUtils.getCurrentUserDeptName());*/

        bean.setFxmnr(bxd.getFbxnrms());
        if (StringUtils.isBlank(bean.getFxmsj())) {
            bean.setFxmsj(bxd.getFbxsjms());
        }

        bean.setFlczt(SpcyFlowConstant.LCZT_LCZB);

        if (StringUtils.isBlank(bean.getFsqje())){
            bean.setFsqje("0");
        }
        spcyJcyFybxdtssxsqService.save(bean);

        // 报销特殊申请状态
        updateBxdTssxsq(bean.getFbxdid());

        String log = LogUtils.MapToStringMethod(ObjectToMapUtils.objectToMap(bean));
        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD,log,bean.getFbxdid(),"添加特殊事项申请", SpcyConstant.LOGS_SYS_TYPE_XZ);

        return bean;
    }

    /**
     * 更新-特殊事项申请
     */
    public void updateFybxdTssxSq(HashMap<String,String> buffer) throws IllegalAccessException, InvocationTargetException {
        String id = buffer.get("id");
        if (StringUtils.isBlank(id)){
            throw new BusinessException("参数为空！");
        }

        SpcyJcyFybxdtssxsq updateBean = spcyJcyFybxdtssxsqService.getById(id);
        if (updateBean == null){
            throw new BusinessException("没有相匹配数据！");
        }

        Map<String, Object> oldMap = ObjectToMapUtils.objectToMap(updateBean);

        ConvertUtils.register(new DateConvert(), java.util.Date.class);
        // 自动完成页面到bean的数据对接
        BeanUtils.populate(updateBean, buffer);

        // 额外费用
        if (StringUtils.isNotBlank(updateBean.getFewfybxsqrid())){
            List<YcSysUser> userList = sysUserService.findRealnameListByIds(StringPatternUtils.getListByIds(updateBean.getFewfybxsqrid()));
            String sqr = "";
            if (CollectionUtil.isNotEmpty(userList)){
                for (YcSysUser user : userList){
                    if (StringUtils.isNotBlank(sqr)){
                        sqr += "," + user.getRealname();
                    }else {
                        sqr += user.getRealname();
                    }
                }
            }
            updateBean.setFewfybxsqrxm(sqr);
        }

        // 午休
        if (StringUtils.isNotBlank(updateBean.getFwxfsqrid())){
            List<YcSysUser> userList = sysUserService.findRealnameListByIds(StringPatternUtils.getListByIds(updateBean.getFwxfsqrid()));
            String sqr = "";
            if (CollectionUtil.isNotEmpty(userList)){
                for (YcSysUser user : userList){
                    if (StringUtils.isNotBlank(sqr)){
                        sqr += "," + user.getRealname();
                    }else {
                        sqr += user.getRealname();
                    }
                }
            }
            updateBean.setFwxfsqrxm(sqr);
        }

        updateBean.setUpdateTime(new Date());
        updateBean.setUpdateBy(GetCurrentUserUtils.getCurrentUserAccount());
        spcyJcyFybxdtssxsqService.updateById(updateBean);

        String operContent = "基本信息修改：";
        operContent += LogUtils.BeanModifyMsg(updateBean,oldMap);

        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD,operContent,updateBean.getFbxdid(),"修改特殊事项申请", SpcyConstant.LOGS_SYS_TYPE_XG);
    }

    /**
     * 删除-特殊事项申请
     */
    public void deleteFybxdTssxSq(String id){
        if (StringUtils.isBlank(id)){
            throw new BusinessException("参数为空！");
        }

        SpcyJcyFybxdtssxsq bean = spcyJcyFybxdtssxsqService.getById(id);
        if (bean == null){
            throw new BusinessException("没有相匹配的数据！");
        }
        spcyJcyFybxdtssxsqService.removeById(id);

        String log = LogUtils.MapToStringMethod(ObjectToMapUtils.objectToMap(bean));
        spcyLogService.addLogs(LogConstant.LOGS_JCY_FYBXD,log,bean.getFbxdid(),"删除特殊事项申请", SpcyConstant.LOGS_SYS_TYPE_SC);
    }

    /**
     * 更新报销单-特殊事项申请
     */
    private void updateBxdTssxsq(String fbxdid){
        if (StringUtils.isBlank(fbxdid)){
            return;
        }

        LambdaUpdateWrapper<SpcyJcyFybxd> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(SpcyJcyFybxd::getId, fbxdid);

        SpcyJcyFybxd updateBean = new SpcyJcyFybxd();
        updateBean.setFsfytssxsq(JcyFybxdConstant.FYBXD_SFYTSSXSQ_YES);
        spcyJcyFybxdService.update(updateBean, updateWrapper);

    }
}
